<?php
/**
 * 公用函数类
 * @文件名称: Common.php
 * @author: jawei
 * @Email: gaozhiwei@etcp.cn
 * @Date: 2017-06-06
 * @Copyright: 2017 悦畅科技有限公司. All rights reserved.
 * 注意：本内容仅限于悦畅科技有限公司内部传阅，禁止外泄以及用于其他的商业目的
 */
namespace app\lib;
use yii;
class Common extends EtcpApi
{
    public $uid = null;
    public $userInfo = null;

    /**
     * 正则匹配手机号.
     */
    public static function pregPhonNum($phoneNum)
    {
        //if(preg_match("/^1[0-9]{10}$/",$phoneNum)){//13[0-9]{1}[0-9]{8}$|15[012356789]{1}[0-9]{8}$|18[0-9]{9}
        #根据支付的手机号校验规则修改
        if (preg_match("/^1[345789]\d{9}$/", $phoneNum)) {
            //13[0-9]{1}[0-9]{8}$|15[012356789]{1}[0-9]{8}$|18[0-9]{9}
            //验证通过
            return true;
        } else {
            //手机号码格式不对
            return false;
        }
    }
    /**
     * 验证身份证号.
     * @param $vStr
     * @return bool
     */
    public static function isCreditNo($idcard)
    {
        $City = array(11 => '北京', 12 => '天津', 13 => '河北', 14 => '山西', 15 => '内蒙古', 21 => '辽宁', 22 => '吉林', 23 => '黑龙江', 31 => '上海', 32 => '江苏', 33 => '浙江', 34 => '安徽', 35 => '福建', 36 => '江西', 37 => '山东', 41 => '河南', 42 => '湖北', 43 => '湖南', 44 => '广东', 45 => '广西', 46 => '海南', 50 => '重庆', 51 => '四川', 52 => '贵州', 53 => '云南', 54 => '西藏', 61 => '陕西', 62 => '甘肃', 63 => '青海', 64 => '宁夏', 65 => '新疆', 71 => '台湾', 81 => '香港', 82 => '澳门', 91 => '国外');
        $iSum = 0;
        $idCardLength = strlen($idcard);
        //长度验证
        if (!preg_match('/^\d{17}(\d|x)$/i', $idcard) and !preg_match('/^\d{15}$/i', $idcard)) {
            return false;
        }
        //地区验证
        if (!array_key_exists(intval(substr($idcard, 0, 2)), $City)) {
            return false;
        }
        // 15位身份证验证生日，转换为18位
        if ($idCardLength == 15) {
            $sBirthday = '19'.substr($idcard, 6, 2).'-'.substr($idcard, 8, 2).'-'.substr($idcard, 10, 2);
            $sBirthdayTime = strtotime($sBirthday);
            $dd = date('Y-m-d', $sBirthdayTime);
            if ($sBirthday != $dd) {
                return false;
            }
            $idcard = substr($idcard, 0, 6).'19'.substr($idcard, 6, 9);//15to18
            $Bit18 = self::getVerifyBit($idcard);//算出第18位校验码
            $idcard = $idcard.$Bit18;
        }
        // 判断是否大于2078年，小于1900年
        $year = substr($idcard, 6, 4);
        if ($year < 1900 || $year > 2078) {
            return false;
        }
        //18位身份证处理
        $sBirthday = substr($idcard, 6, 4).'-'.substr($idcard, 10, 2).'-'.substr($idcard, 12, 2);
        $sBirthdayTime = strtotime($sBirthday);
        $dd = date('Y-m-d', $sBirthdayTime);
        if ($sBirthday != $dd) {
            return false;
        }

        return true;
        //身份证编码规范验证
        /*
        $idcard_base = substr($idcard,0,17);
        if(strtoupper(substr($idcard,17,1)) != self::getVerifyBit($idcard_base))
            {
               return false;
        }
        return true;
         */
    }

    // 计算身份证校验码，根据国家标准GB 11643-1999
    public static function getVerifyBit($idcard_base)
    {
        if (strlen($idcard_base) != 17) {
            return false;
        }
        //加权因子
        $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
        //校验码对应值
        $verify_number_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
        $checksum = 0;
        for ($i = 0; $i < strlen($idcard_base); ++$i) {
            $checksum += substr($idcard_base, $i, 1) * $factor[$i];
        }
        $mod = $checksum % 11;
        $verify_number = $verify_number_list[$mod];

        return $verify_number;
    }
    /**
     *数字金额转换成中文大写金额的函数
     *String Int  $num  要转换的小写数字或小写字符串
     *return 大写字母
     *小数位为两位.
     **/
    public static function num_to_rmb($num)
    {
        $c1 = '零壹贰叁肆伍陆柒捌玖';
        $c2 = '分角元拾佰仟万拾佰仟亿';
        //精确到分后面就不要了，所以只留两个小数位
        $num = round($num, 2);
        //将数字转化为整数
        $num = $num * 100;
        if (strlen($num) > 10) {
            return '金额太大，请检查';
        }
        $i = 0;
        $c = '';
        while (1) {
            if ($i == 0) {
                //获取最后一位数字
                $n = substr($num, strlen($num) - 1, 1);
            } else {
                $n = $num % 10;
            }
            //每次将最后一位数字转化为中文
            $p1 = substr($c1, 3 * $n, 3);
            $p2 = substr($c2, 3 * $i, 3);
            if ($n != '0' || ($n == '0' && ($p2 == '亿' || $p2 == '万' || $p2 == '元'))) {
                $c = $p1.$p2.$c;
            } else {
                $c = $p1.$c;
            }
            $i = $i + 1;
            //去掉数字最后一位了
            $num = $num / 10;
            $num = (int) $num;
            //结束循环
            if ($num == 0) {
                break;
            }
        }
        $j = 0;
        $slen = strlen($c);
        while ($j < $slen) {
            //utf8一个汉字相当3个字符
            $m = substr($c, $j, 6);
            //处理数字中很多0的情况,每次循环去掉一个汉字“零”
            if ($m == '零元' || $m == '零万' || $m == '零亿' || $m == '零零') {
                $left = substr($c, 0, $j);
                $right = substr($c, $j + 3);
                $c = $left.$right;
                $j = $j - 3;
                $slen = $slen - 3;
            }
            $j = $j + 3;
        }
        //这个是为了去掉类似23.0中最后一个“零”字
        if (substr($c, strlen($c) - 3, 3) == '零') {
            $c = substr($c, 0, strlen($c) - 3);
        }
        //将处理的汉字加上“整”
        if (empty($c)) {
            return '零元整';
        } else {
            return $c.'整';
        }
    }

    /**
     * 中文匹配
     * @param $str
     * @param int $type 是否包含中文（）
     * @return int
     */
    public static function pregChinese($str, $type = 0)
    {
        if ($type) {
            return preg_match("/^[\x{4e00}-\x{9fa5}|\（|\）]+$/u", $str);
        }
        return preg_match("/^[\x{4e00}-\x{9fa5}]+$/u", $str);
    }

    /**
     * 生成随机字符串
     * @param $length
     * @return null|string
     */
    public static function getRandChar($length)
    {
        $str = null;
        $strPol = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
        $max = strlen($strPol) - 1;
        for ($i = 0;$i < $length;++$i) {
            $str .= $strPol[rand(0, $max)];//rand($min,$max)生成介于min和max两个数之间的一个随机整数
        }
        return $str;
    }
    /**
     * 生成随机字符串数字
     * @param $length
     * @return null|string
     */
    public static function getRandNumStr($length)
    {
        $str = null;
        $strPol = '0123456789';
        $max = strlen($strPol) - 1;
        for ($i = 0;$i < $length;++$i) {
            $str .= $strPol[rand(0, $max)];//rand($min,$max)生成介于min和max两个数之间的一个随机整数
        }
        return $str;
    }
    /**
     * 清除中文中空格
     * @return string
     * @author gaozw
     **/
    public static function trimSpace($value)
    {
        $arr = preg_split('/(?<!^)(?!$)/u', $value);
        $new_name = '';
        foreach ($arr as $font) {
            if (strlen(trim($font))) {
                $new_name .= $font;
            }
        }
        return $new_name;
    }
    /**
     * 根据身份证号码获取对应的出生年
     * @param $idcard
     * @return bool|string
     */
    public static function getYearByIdCard($idcard)
    {
        $idCardLength = strlen($idcard);
        // 15位身份证验证生日，转换为18位
        if ($idCardLength == 15) {
            $sBirthday = '19'.substr($idcard, 6, 2).'-'.substr($idcard, 8, 2).'-'.substr($idcard, 10, 2);
            $sBirthdayTime = strtotime($sBirthday);
            $dd = date('Y-m-d', $sBirthdayTime);
            if ($sBirthday != $dd) {
                return false;
            }
            $idcard = substr($idcard, 0, 6).'19'.substr($idcard, 6, 9);//15to18
            $Bit18 = self::getVerifyBit($idcard);//算出第18位校验码
            $idcard = $idcard.$Bit18;
        }
        // 判断是否大于2078年，小于1900年
        $year = substr($idcard, 6, 4);
//        if ($year<1900 || $year>2078 )
//        {
//            return false;
//        }
        return $year;
    }


    /**
     * 验证日期格式
     * @param       $dateTime   2014-11-11
     * @return bool|int
     */
    public static function verifyTimeStr($dateTime) {
        $is_date=strtotime($dateTime) ? strtotime($dateTime) : false;
        return $is_date;
    }

    /**
     * 验证邮箱格式是否正确
     * @param       $email      Email字符串
     * @return bool
     */
    public static function verifyEmail($email) {
        $pattern = "/^([0-9A-Za-z\\-_\\.]+)@([0-9a-z]+\\.[a-z]{2,3}(\\.[a-z]{2})?)$/i";
        if ( preg_match( $pattern, $email ) )
        {
            return true;
        }
        return false;
    }

    /**
     * 屏蔽电话号码中间四位
     * @param $phone
     * @return mixed
     */
    public static function hidtel($phone){
        $IsWhat = preg_match('/(0[0-9]{2,3}[\-]?[2-9][0-9]{6,7}[\-]?[0-9]?)/i',$phone); //固定电话
        if($IsWhat == 1){
            return preg_replace('/(0[0-9]{2,3}[\-]?[2-9])[0-9]{3,4}([0-9]{3}[\-]?[0-9]?)/i','$1****$2',$phone);
        }else{
            return  preg_replace('/(1[358]{1}[0-9])[0-9]{4}([0-9]{4})/i','$1****$2',$phone);
        }
    }
    /**
     * 设置cookie
     * @param $key
     * @param $value
     */
    public static function setCookie($key, $value) {
        if(is_array($value)) {
            $value = json_encode($value);
        }
        return setcookie($key, $value, time() + 86400, '/', null, null, true);
    }
    /**
     * 获取cookie值
     * @param $key
     * @return string
     */
    public static function getCookie($key, $isArr = false) {
        if(isset($_COOKIE[$key]) && !empty($_COOKIE[$key])) {
            if($isArr) {
                return json_decode($_COOKIE[$key],true);
            } else {
                return $_COOKIE[$key];
            }
        }
        return '';
    }
    /**
     * 把给定的整数转换成中文
     *
     * @param $num 整数 < 100
     *
     * @return string 中文数字
     */
    public static function getChineseNo($num) {
        if (is_null($num) || !is_numeric($num))
            return '零';
        $arr_n = array("零","一","二","三","四","五","六","七","八","九","十");
        if ($num <= 10)
            $r = $arr_n[$num];
        else if($num%10 == 0)
            $r = $arr_n[intval($num/10)] . '十';
        else if ($num < 20)
            $r = '十' . $arr_n[$num%10];
        else {
            $r = $arr_n[intval($num/10)] . '十' . $arr_n[$num%10];
        }
        return $r;
    }

    /**
     * 获取本机的IP地址, 目前支持Linux
     *
     * @param  string $eth 网卡编号
     * @return string ip
     */
    public static function getLocalIp($eth = 'eth0')
    {
        if(stristr(PHP_OS, 'Linux'))
        {
            $ifconfig = shell_exec('/sbin/ifconfig ' . $eth);
            if (preg_match('/addr:([\d\.]+)/', $ifconfig, $match))
            {
                return $match[1];
            }
        }
        if (isset($_SERVER['SERVER_ADDR']))
        {
            return $_SERVER['SERVER_ADDR'];
        }
        return '127.0.0.1';
    }


    /**
     * 屏蔽手机号中间四位
     *
     * @param  integer $mobile 手机号, 11 位
     * @return string  屏蔽后的手机号
     */
    public static function maskMobile($mobile)
    {
        return preg_replace('/(1[34578]{1}[0-9])[0-9]{4}([0-9]{4})/i','${1}****${2}', $mobile);
    }

    /**
     * 屏蔽用户名前边的字符
     *
     * @param  string $userName 用户名
     * @return string 屏蔽后的用户名
     */
    public static function maskUserName($userName)
    {
        $charLen = mb_strlen($userName, 'utf-8');
        if ($charLen > 1)
        {
            $userName = str_repeat('*', $charLen - 1) . mb_substr($userName, -1, 1, 'utf-8');
        }
        return $userName;
    }
    /**
     * 获取短信验证码
     * @param  integer $len 验证码长度
     * @return numeric
     */
    public static function getVerifyCode($len = 6)
    {
        $code = '';
        while ($len > 0)
        {
            $code .= (rand(0, 100) % 10);
            $len--;
        }
        return $code;
    }
}
